package day14;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * @author: 王丹
 * @create: 2021-07-06 15:41
 **/
//唤醒方法放在等待方法之前执行，看一下线程是否能够被唤醒呢？
public class Demo8 {
    /**
     * 结果分析:
     * 代码中启动t1线程，t1线程内部休眠了5秒，然后主线程休眠1秒之后，调用了 LockSupport.unpark(t1);
     * 唤醒线程t1，此时 LockSupport.park();方法还未执行，说明唤醒方法在等待方法之前执行的；输出结果中2、3
     * 行结果时间一样，表示 LockSupport.park();没有阻塞了，是立即返回的。
     *
     * 说明：唤醒方法在等待方法之前执行，线程也能够被唤醒，这点是另外2中方法无法做到的。Object和Condition中
     * 的唤醒必须在等待之后调用，线程才能被唤醒。而LockSupport中，唤醒的方法不管是在等待之前还是在等待之后
     * 调用，线程都能够被唤醒。
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " start!");
            LockSupport.park();
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " 被唤醒!");
        });
        t1.setName("t1");
        t1.start();
        TimeUnit.SECONDS.sleep(1);
        LockSupport.unpark(t1);
        System.out.println(System.currentTimeMillis() + ", LockSupport.unpark() 执行完毕!");
    }
}
